/*
 *
 * Copyright 2017 Asylo authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#include "asylo/platform/arch/include/trusted/hardware_random.h"

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>

// Fills a buffer |buf| with |count| bytes generated by rand(). This is not a
// cryptographically strong source of randomness and should never be used in a
// secure application.  It is only sufficient for the simulation backend because
// it is not intended for production use.
extern "C" ssize_t enc_hardware_random(uint8_t *buf, size_t count) {
  static bool only_once = true;
  if (only_once) {
    only_once = false;

    // Seed the RNG
    srand(time(nullptr));
  }

  std::generate(&buf[0], &buf[count], ::rand);
  return count;
}
